package cn.tedu.lbs.basic.web.service;

import cn.tedu.lbs.basic.web.repository.UserRepository;
import cn.tedu.lbs.basic.web.repository.UserTagsRepository;
import cn.tedu.lbs.basic.web.utils.AuthenticationContextUtil;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.tarena.lbs.base.common.utils.Asserts;
import com.tarena.lbs.base.protocol.exception.BusinessException;
import com.tarena.lbs.common.passport.principle.UserPrinciple;
import com.tarena.lbs.pojo.basic.param.UserTagsParam;
import com.tarena.lbs.pojo.basic.po.UserPO;
import com.tarena.lbs.pojo.basic.po.UserTagsPO;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;

@Service
public class UserTagsService {
    @Autowired
    private UserTagsRepository userTagsRepository;
    @Autowired
    private UserRepository userRepository;
    //页面交互 允许用户多次提交绑定的,但是每次绑定 只保存本次数据 如有
    //存在历史数据 先删除
    //当前业务方法涉及到解决方案
    //1.幂等设计
    //2.tagIds 的数据转化 数组
    //3.批量插入
    public void userAddTags(UserTagsParam userTagsParam) throws BusinessException {
        //1.获取登录 用户id
        Integer userId=getUserId();
        //2.根据userId 移除历史绑定信息
        removeUserTags(userId);
        //3.封装数据批量写入
        saveBatchUserTags(userTagsParam,userId);
    }

    private void saveBatchUserTags(UserTagsParam userTagsParam, Integer userId) {
        //准备批量入参 List<UserTagsPO>
        List<UserTagsPO> pos=null;
        String[] tagIds = userTagsParam.getTagIds().split(",");
        pos=Arrays.stream(tagIds).map(tagId->{
            UserTagsPO po=new UserTagsPO();
            po.setUserId(userId);
            po.setTagId(Integer.parseInt(tagId));
            return po;
        }).collect(Collectors.toList());
        //批量新增 在ServiceImpl实现的 如果只有BaseMapper 就没有批量需要自己扩展
        userTagsRepository.saveBatch(pos);
        //新增完成之后 用户状态记录 已绑定标签为status=1
        //update lbs_user set status=1 where id=?
        UserPO poParam=new UserPO();
        poParam.setStatus(1);//非主键字段 更新数据 保证非空
        poParam.setId(userId);//主键字段 更新条件
        userRepository.updateById(poParam);
    }

    private void removeUserTags(Integer userId) {
        //delete from lbs_user_tags where user_id=?
        QueryWrapper queryWrapper=new QueryWrapper();
        queryWrapper.eq("user_id",userId);
        userTagsRepository.remove(queryWrapper);
    }

    private Integer getUserId() throws BusinessException {
        //读取 认证 传递的userPrinciple 线程和过滤器线程相同
        UserPrinciple userPrinciple = AuthenticationContextUtil.get();
        Asserts.isTrue(userPrinciple==null,new BusinessException("-2","用户认证解析失败"));
        return userPrinciple.getId();
    }
}
